// Copyright (c) 2008 Davy Brion (ralinx@davybrion.com)
// All rights reserved.
// 
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
// 
//     * Redistributions of source code must retain the above copyright notice,
//       this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above copyright notice,
//       this list of conditions and the following disclaimer in the documentation
//       and/or other materials provided with the distribution.
//     * Neither the name of Davy Brion nor the names of the
//       contributors may be used to endorse or promote products derived from this
//       software without specific prior written permission.
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

using System.Collections.Generic;
using System.Linq;

using Albatross.Common.Messaging;

namespace Albatross.ClientSide.Messaging
{
	public class DispatcherStub : Dispatcher
	{
		private Response[] responsesToReturn;
		private readonly Dictionary<string, Request> keyToRequest = new Dictionary<string, Request>();

		public DispatcherStub() : base(null) {}

		public void SetResponsesToReturn(params Response[] responses)
		{
			responsesToReturn = responses;
		}

		public override void Clear()
		{
			// make this a no-op... one of the goals of this class is to inspect
			// the received requests so we can't allow the real client code to 
			// clear these during our tests
		}

		public override void Add(string key, Request request)
		{
			base.Add(key, request);
			keyToRequest[key] = request;
		}

		public override TResponse Get<TResponse>(Request request)
		{
			Add(request);
			return Get<TResponse>();
		}

		public TRequest GetRequest<TRequest>() where TRequest : Request
		{
			return (TRequest)Requests.First(r => r.GetType().Equals(typeof(TRequest)));
		}

		public TRequest GetRequest<TRequest>(string key) where TRequest : Request
		{
			return (TRequest)keyToRequest[key];
		}

		protected override Response[] GetResponses(Request[] requestsToProcess)
		{
			return responsesToReturn;
		}
	}
}